package com.rose.redis._data_structure.set;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.data.redis.core.StringRedisTemplate;

/**
 * Redis的Set
 * 一：类似于Java中的HashSet，无序，不可重复。
 *
 * 二：使用场景：
 * 1：好友、关注、粉丝、感兴趣的人集合：
 * 1) sinter命令可以获得A和B两个用户的共同好友。e.g：取交集 stringRedisTemplate.opsForSet().intersect
 * 2) sismember命令可以判断A是否是B的好友。e.g：判断 stringRedisTemplate.opsForSet().isMember
 * 3) scard命令可以获取好友数量。e.g：计数 stringRedisTemplate.opsForSet().members
 * 4) 关注时，smove命令可以将B从A的粉丝集合转移到A的好友集合。e.g：移动 stringRedisTemplate.opsForSet().move
 *
 * 2：首页展示随机：美团首页有很多推荐商家，但是并不能全部展示，set类型适合存放所有需要展示的内容，而srandmember命令则可以从中随机获取几个。
 *
 * 3：存储某活动中中奖的用户ID ，因为有去重功能，可以保证同一个用户不会中奖两次。
 *
 * 三：常用命令
 * 1：sadd [key] [value]：向指定key的set中添加元素。
 * 2：smembers [key]：获取指定key 集合中的所有元素。
 * 3：sismember [key] [value]：判断集合中是否存在某个value。
 * 4：scard [key]：获取集合的长度。
 * 5：spop [key]：弹出一个元素。
 * 6：srem [key] [value]：删除指定元素。
 *
 * @author: zhu.chen
 * @date: 2021/1/5
 * @version: v1.0.0
 */
//@Component
public class TestSetCommandLineRunner implements CommandLineRunner {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Override
    public void run(String... args) throws Exception {
        stringRedisTemplate.opsForSet().add("username", "zhangsan", "zhuchen");
        stringRedisTemplate.opsForSet().add("name", "zhangsan", "xiaohong");
        System.out.println(stringRedisTemplate.opsForSet().intersect("username", "name").toString());
        System.out.println(stringRedisTemplate.opsForSet().isMember("username","zhangsan"));
        System.out.println(stringRedisTemplate.opsForSet().members("username").size());
    }

}
